package com.iiot.bytes;

public class Conv {
    /**
     * 将十进制数值（0~99）转换为BCD码字节
     * 例如：25 → 0x25, 9 → 0x09, 12 → 0x12
     *
     * @param val 十进制值（建议范围 0~99）
     * @return 对应的BCD编码字节
     */
    public static byte dec2bcd(byte val) {
        int high = (val / 10) & 0x0F;   // 十位
        int low = val % 10;             // 个位
        return (byte) ((high << 4) | low);
    }

    /**
     * 将BCD码字节转换为十进制数值
     * 例如：0x25 → 25, 0x09 → 9, 0x12 → 12
     *
     * @param val BCD编码字节
     * @return 对应的十进制值
     */
    public static byte bcd2dec(byte val) {
        int high = (val >> 4) & 0x0F;   // 高4位
        int low = val & 0x0F;           // 低4位
        return (byte) (high * 10 + low);
    }

    /**
     * 将 short 值以网络字节序（大端序）写入字节数组
     * 例如：2025 (0x07E9) → 写入 [0x07, 0xE9]
     *
     * @param data   目标字节数组
     * @param offset 起始写入位置
     * @param value  要写入的值（会被强转为 short）
     */
    public static void setShortNetOrder(byte[] data, int offset, int value) {
        short s = (short) value;
        data[offset] = (byte) ((s >> 8) & 0xFF);   // 高位字节
        data[offset + 1] = (byte) (s & 0xFF);      // 低位字节
    }

    /**
     * （可选）从字节数组中按网络字节序读取 short 值
     * 例如：[0x07, 0xE9] → 2025
     *
     * @param data   源字节数组
     * @param offset 起始读取位置
     * @return 读取的 short 值
     */
    public static short getShortNetOrder(byte[] data, int offset) {
        return (short) (((data[offset] & 0xFF) << 8) |
                (data[offset + 1] & 0xFF));
    }
}
